<?php
    /**
    * Класс для работы с ftp
    * @package ru.vbinc.gm.framework.net
    * @author GreyMag
    * @copyright 2009
    * @version 0.1
    * @access public
    */
    class FTP
    {
        public $error;

        private $_connect;

        /**
        * FTP
        * Класс для работы с FTP
        * @param string $host имя хоста
        * @param string $login имя пользователя ftp
        * @param string $pass пароль пользователя ftp
        * @param integer $port номер порта, через который осуществляется соединение
        * @param integer $timeout максимально время выполнения сценария
        * @return void
        */
        function __construct( $host, $login = '', $pass = '', $port = 21, $timeout = 90 )
        {
            $port = (int)$port;
            $timeout = (int)$timeout;

            $this->_connect = @ftp_connect( $host, $port, $timeout );

            if( !$this->checkConnect() ) return false;
            if( $login != '' ) @ftp_login( $this->_connect, $login, $pass );
        }

        /**
        * FTP::put()
        * Загрузить файл на удалённый сервер
        * @param string $remoteFile имя на удалённом сервере
        * @param string $localFile имя на локальном сервере
        * @param integer $mode режим передачи
        * @param integer $startPos начальная позиция
        * @return bool
        */
        public function put( $remoteFile, $localFile )
        {
            if( !$this->checkConnect() ) return false;

            $mode = $this->checkMode( $mode );

            if( ftp_put( $this->_connect, $remoteFile, $localFile, FTP_BINARY) ) return true;
            else {
                $this->error = "Ошибка загрузки файла";
                return false;
            }
        }

        /**
        * FTP::fPut()
        * Чтение и загрузка файла на сервер
        * @param mixed $remoteFile
        * @param integer $openFile дескриптор открытого файла
        * @param integer $mode режим передачи
        * @return
        */
        public function fPut( $remoteFile, $openFile, $mode )
        {
            if( !$this->checkConnect() ) return false;

            if( ftp_fput( $this->_connect, $remoteFile, $openFile, FTP_BINARY ) ) return true;
            else {
                $this->error = "Ошибка загрузки открытого файла";
                return false;
            }
        }

        /**
        * FTP::mkDir()
        * Создание директории
        * @param string $directory имя создаваемой директории
        * @return имя созданной директории или false в случае ошибки
        */
        public function mkDir( $directory )
        {
            if( !$this->checkConnect() ) return false;

            if( $name = ftp_mkdir( $this->_connect, $directory ) ) return $name;
            else {
                $this->error = "Ошибка создания директории";
                return false;
            }
        }

        /**
        * FTP::close()
        * Закрываем соединение
        * @return void
        */
        public function close()
        {
            if( $this->checkConnect() ) ftp_quit( $this->_connect );
        }

        /**
        * FTP::checkConnect()
        * Проверка соединения
        * @return bool
        */
        protected function checkConnect()
        {
            if( !$this->_connect )
            {
                $this->error = "Ошибка соединения";
                return false;
            }
            else return true;
        }

        /**
        * FTP::checkMode()
        * Проверка режима
        * @param integer $mode проверяемый режим
        * @return integer режим
        */
        protected function checkMode( $mode )
        {
            return MODE_FTP_BINARY;
        }

        public function ftp_removeAll($src_dir) 
        {
            $file_array =  ftp_nlist ($this->_connect, $src_dir);

            foreach ($file_array as $file)
            {
                if ($file != '.' && $file != '..')
                {

                    if ( !ftp_delete($this->_connect, $src_dir.'/'.$file) )
                    {
                        $this->ftp_removeAll ($src_dir.'/'.$file);
                    }
                    else
                    {
                        echo $src_dir.'/'.$file.' удален <br>';
                    }
                }
            }
        }



        public function ftp_putAll($dir = '') 
        {
            $ftp_dir = $this->ftp_root.'/'.$dir.'/';
            $ftp_dir = str_replace('//', '/', $ftp_dir);

            if ( !empty($dir))
            {
                //echo 'Папка '. $ftp_dir . ((ftp_mkdir($this->_connect, $ftp_dir)) ? ' создана' : ' не создана').'<br />';
                @ ftp_mkdir($this->_connect, $ftp_dir);
                @ ftp_chmod($this->_connect, 0777, $ftp_dir);
            }

            //$filelist = glob(($dir!='') ? $dir.'/*' : '*');
            $_local_dir = $this->local_dir.'/'.$dir.'/';
            $_local_dir = str_replace('//', '/', $_local_dir);


            $filelist = glob($_local_dir.'*');


            if ($filelist == array())
                return 0;




            foreach ($filelist as $file)
            {

                //$_local = $this->local_dir.'/'.$dir.'/'.$file;
                // $_local = str_replace('//', '/', $_local);

                if ( is_file($file) )
                {
                    $_file = str_replace( str_replace('//', '/', $this->local_dir.'/'.$dir.'/') ,'', $file);

                    // echo ':'.$ftp_dir.$_file.'<br>';
                    // echo $this->_connect, $this->ftp_root .'--'. preg_replace('/^'.$this->local_dir.'\//', '', $file).'--', $file, FTP_BINARY;
                    //  echo $this->ftp_root . preg_replace('/^'.$this->local_dir.'\//', '', $file).'<br>';
                    // echo 'Файл ' . $_file . ((ftp_put($this->_connect, $ftp_dir.$_file, $file, FTP_BINARY)) ? ' загружен' : ' не загружен').'<br />';
                    @ ftp_put($this->_connect, $ftp_dir.$_file, $file, FTP_BINARY);
                    @ ftp_chmod($this->_connect, 0777, $ftp_dir.$_file);
                }
                else
                {    
                    if ( is_dir($file) )
                    {
                        $_file = str_replace($this->local_dir.'/','', $file);
                        $this->ftp_putAll($_file);
                        //   echo 'папка '.$_file.'<br>';
                    } 
                    else
                    {
                        //  echo 'хер его знает.';
                        //  echo 'папка '.$file.'<br>';
                    }
                }
            }
            return 0;   

        }
        
        function rmfile($file)
        {
           @ ftp_delete ($this->_connect, $file); 
        }

        function rmdir($dir)
        {
            @ ftp_rmdir ($this->_connect, $dir);

            $file_list = ftp_nlist ($this->_connect, $dir);

            if ( is_array($file_list) && count($file_list) > 0 )
            {
                foreach ($file_list as $file)
                {
                    if ( $file != $dir.'/.' && $file != $dir.'/..')
                    {

                        if ( ftp_size($this->_connect, $file) == -1 )
                        {
                            $this->rmdir( $file ); 
                        }
                        else
                        {   
                           @ ftp_delete ($this->_connect, $file);
                        }

                    }
                }

                @ ftp_rmdir ($this->_connect, $dir);
            }

        } 
    }
?>